package com.Dao;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.Common.PageInfo;
import com.Util.JdbcUtil;

/**
 * 	简单的增删改查 通用类
 * @author mrt
 */
public  class BaseDao {
	
	/**
	 * 新增数据
	 * @param sql
	 * @param params
	 * @return
	 */
	public boolean update(String sql,Object... params) {
		//创建连接
		Connection conn = JdbcUtil.getConn();
		PreparedStatement prep = null;
		try {
			prep = conn.prepareStatement(sql);
			for (int i = 0; i < params.length; i++) {
				prep.setObject(i+1, params[i]);
			}
			int m = prep.executeUpdate();
			return m == 1?true:false;
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JdbcUtil.close(conn, prep);
		}
		return false;
	}
	/**
	 * @Title: selectPage
	 * @author: Mr.T   
	 * @date: 2019年9月23日 下午4:53:03 
	 * @Description: 分页查询工具类
	 * @param <T>
	 * @param sql
	 * @param cls
	 * @param page
	 * @param limit
	 * @return
	 * @return: PageInfo<T>
	 */
	public <T> PageInfo<T> selectPage(String sql,Class<T> cls,Integer page,Integer limit) {
		PageInfo<T> pageInfo = new PageInfo<T>();
		//查询数量
		int count = this.getCount(sql);
		sql = sql +"  limit "+((page-1)*limit)+","+limit;
		// 查询List
		List<T> data = this.selectList(sql, cls);
		pageInfo.setList(data);
		pageInfo.setCount(count);
		return pageInfo;
	}
	/**
	 * @Title: getCount
	 * @author: Mr.T   
	 * @date: 2019年9月23日 下午4:50:03 
	 * @Description: 获取数据条数
	 * @param sql
	 * @return
	 * @return: int
	 */
	private int getCount(String sql) {
		sql = "select count(1) from ("+sql+") rs";
		Connection conn = JdbcUtil.getConn();
		PreparedStatement prep = null;
		ResultSet rs = null;
		try {
			prep = conn.prepareStatement(sql);
			rs = prep.executeQuery();
			rs.next();
			return rs.getInt(1);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return 0;
	}
	
	/**
	 * @Title: insert
	 * @author: Mr.T   
	 * @date: 2019年9月20日 上午9:52:50 
	 * @Description: 返回 添加的数据 自动生成  主键ID
	 * @param sql
	 * @param params
	 * @return
	 * @return: int
	 */
	public int insert(String sql,Object... params) {
		//创建连接
		Connection conn = JdbcUtil.getConn();
		PreparedStatement prep = null;
		try {
			prep = conn.prepareStatement(sql,PreparedStatement.RETURN_GENERATED_KEYS);
			for (int i = 0; i < params.length; i++) {
				prep.setObject(i+1, params[i]);
			}
			int m = prep.executeUpdate();
			System.out.println(m);
			//返回 数据中生成 键   此时一定只有一行数据
			ResultSet rs = prep.getGeneratedKeys();
			if(m > 0) {
				// 读取的文件针  向下偏移一行
				rs.next();
				return rs.getInt(1);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JdbcUtil.close(conn, prep);
		}
		return -1;
	}
	
	/**
	 * 查询单个对象
	 * @param <T>
	 * @param sql
	 * @param cls
	 * @param params
	 * @return
	 */
	public <T> T selectOne(String sql,Class<T> cls,Object... params) {
		PreparedStatement ps = null;
		ResultSet rs = null;
		Connection conn = JdbcUtil.getConn();
		try {

			ps = conn.prepareStatement(sql);
			for (int i = 0; i < params.length; i++) {
				ps.setObject(i + 1, params[i]);
			}

			rs = ps.executeQuery();
			ResultSetMetaData rsmd = rs.getMetaData();
			int columnCount = rsmd.getColumnCount();

			if (rs.next()) {
				T t = cls.newInstance();
				for (int i = 0; i < columnCount; i++) {
					Object columValue = rs.getObject(i + 1);
					String columnLabel = rsmd.getColumnLabel(i + 1);
					Field field = cls.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(t, columValue);
				}
				return t;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.close(null, ps, rs);
		}
		return null;
	}
	
	/**
	 * 查询列表
	 * @param <T>
	 * @param sql
	 * @param cls
	 * @param params
	 * @return
	 */
	public <T> List<T> selectList(String sql,Class<T> cls,Object... params){
		Connection conn = JdbcUtil.getConn();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < params.length; i++) {
				ps.setObject(i + 1, params[i]);
			}

			rs = ps.executeQuery();
			// 获取结果集的元数据 :ResultSetMetaData
			ResultSetMetaData rsmd = rs.getMetaData();
			// 通过ResultSetMetaData获取结果集中的列数
			int columnCount = rsmd.getColumnCount();
			// 创建集合对象
			ArrayList<T> list = new ArrayList<T>();
			while (rs.next()) {
				T t = cls.newInstance();
				// 处理结果集一行数据中的每一个列:给t对象指定的属性赋值
				for (int i = 0; i < columnCount; i++) {
					// 获取列值
					Object columValue = rs.getObject(i + 1);

					// 获取每个列的列名
					// String columnName = rsmd.getColumnName(i + 1);
					String columnLabel = rsmd.getColumnLabel(i + 1);

					// 给t对象指定的columnName属性，赋值为columValue：通过反射
					Field field = cls.getDeclaredField(columnLabel);
					field.setAccessible(true);
					field.set(t, columValue);
				}
				list.add(t);
			}

			return list;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.close(conn, ps, rs);

		}

		return null;
	}

	
	
	

}
